package com.sky.controller.admin;

import com.sky.dto.EmployeeDTO;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.dto.PasswordEditDTO;
import com.sky.entity.Employee;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.EmployeeService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/admin")
@Api("用户管理")
public class EmployeeController {
    // 自动注入 EmployeeService，用于调用业务逻辑层的方法
    @Autowired
    private EmployeeService employeeService;

    // 用户登录接口
    @ApiOperation("用户登录")
    @RequestMapping(value = "/employee/login", method = RequestMethod.POST)
    public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
        // 打印登录的用户名和密码日志，方便调试
        log.info("登录的用户名：{}", employeeLoginDTO.getUsername());
        log.info("登录的密码：{}", employeeLoginDTO.getPassword());

        // 调用 service 层的方法，完成登录逻辑
        Employee employee = employeeService.login(employeeLoginDTO);
        log.info("登录成功：empId={}", employee.getId());
        // 登录成功后，创建 JWT 令牌（token），并设置过期时间为 30 天
        Map<String, Object> map = new HashMap<>();
        map.put("empId", employee.getId());
        long time = 1000L * 60 * 60 * 24 * 30; // 设置 JWT 令牌的过期时间（30 天）
        String token = JwtUtil.createJWT("sxx", time, map);

        // 将 token 和员工信息封装到 EmployeeLoginVO 对象中，返回给客户端
        EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder()
                .id(employee.getId())
                .name(employee.getName())
                .userName(employee.getUsername())
                .token(token)
                .build();

        return Result.success(employeeLoginVO); // 返回登录成功的响应结果
    }
    // 用户退出接口
    @ApiOperation("用户退出")
    @PostMapping("/employee/logout")
    public Result logout() {
        return Result.success(); // 返回退出成功的响应结果
    }

    // 修改密码接口
    @ApiOperation("修改密码")
    @PutMapping("/employee/editPassword")
    public Result updatePassword(@RequestBody PasswordEditDTO passwordEditDTO) {
        log.info("当前访问的是修改密码：{}", passwordEditDTO);
        // 调用 service 层的方法，完成修改密码逻辑
        employeeService.updatePassword(passwordEditDTO);
        return Result.success(); // 返回修改密码成功的响应结果
    }

    // 员工分页查询接口
    @GetMapping("/employee/page")
    public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO) {
        log.info("员工分页查询：{}", employeePageQueryDTO);
        // 调用 service 层的 pageQuery 方法，获取分页查询结果
        PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
        // 将分页结果数据封装到响应对象中，返回给客户端
        return Result.success(pageResult);
    }

    // 添加员工接口
    //添加的员工是复制admin的密码为初始密码
    @PostMapping("/employee")
    public Result save(@RequestBody EmployeeDTO employeeDTO) {
        log.info("正在添加员工：{}", employeeDTO);
        // 调用 service 层的方法，完成添加员工逻辑
        employeeService.save(employeeDTO);
        return Result.success(); // 返回添加员工成功的响应结果
    }
    // 修改员工信息接口
    @PutMapping("/employee")
    public Result update(@RequestBody EmployeeDTO employeeDTO) {
        log.info("正在修改员工：{}", employeeDTO);
        // 调用 service 层的方法，完成修改员工信息逻辑
        employeeService.update(employeeDTO);
        return Result.success(); // 返回修改员工信息成功的响应结果
    }
    // 根据员工 ID 查询员工信息接口
    @GetMapping("/employee/{id}")
    public Result<Employee> findEmployeeById(@PathVariable Long id) {
        log.info("获取要修改的员工id:{}", id);
        // 调用 service 层的方法，根据员工 ID 查询员工信息
        Employee employee = employeeService.findEmployeeById(id);
        return Result.success(employee); // 返回查询到的员工信息
    }
    // 修改员工状态接口（启用或禁用）
    @PostMapping("/employee/status/{status}")
    public Result status(@PathVariable Integer status, Long id) {
        log.info("当前正在启用、禁用用户: 启用状态={},用户id={}", status, id);
        // 调用 service 层的方法，修改员工状态
        employeeService.setStatus(status, id);
        return Result.success(); // 返回修改状态成功的响应结果
    }
    // 禁用员工接口
    @PostMapping("/disable/{id}")
    public Result<?> disableEmployee(@PathVariable Long id) {
        try {
            // 调用 service 层的方法，禁用员工
            employeeService.disableEmployee(id);
            return Result.success(); // 返回禁用员工成功的响应结果
        } catch (Exception e) {
            log.error("禁用员工失败，员工ID: {}", id, e); // 记录禁用员工失败的日志
            return Result.error("禁用员工失败，请检查日志"); // 返回禁用员工失败的响应结果
        }
    }
}